Porting trình biên dịch Porting

Thay vì dịch trực tiếp sang mã máy, các trình biên dịch hiện đại dịch sang một mã trung gian độc lập của máy để tăng cường tính di động của trình biên dịch và giảm thiểu các nỗ lực thiết kế. Ngôn ngữ trung gian định nghĩa một máy ảo có thể thực thi tất cả các chương trình được viết bằng ngôn ngữ trung gian (một máy được định nghĩa bằng ngôn ngữ của nó và ngược lại).[4] Các hướng dẫn mã trung gian được dịch thành các chuỗi mã máy tương đương bằng trình tạo mã để tạo mã thực thi. Nó cũng có thể bỏ qua việc tạo mã máy bằng cách thực sự thực hiện một trình thông dịch hoặc JIT cho máy ảo.[5]

Việc sử dụng mã trung gian tăng cường tính di động của trình biên dịch, vì chỉ có mã phụ thuộc máy (trình thông dịch hoặc trình tạo mã) của trình biên dịch cần được port đến máy đích. Phần còn lại của trình biên dịch có thể được nhập dưới dạng mã trung gian và sau đó được xử lý thêm bởi trình tạo mã hoặc trình thông dịch được mã hóa, do đó tạo phần mềm biên dịch hoặc thực thi trực tiếp mã trung gian trên trình thông dịch. Phần độc lập của máy có thể được phát triển và thử nghiệm trên một máy khác (host machine). Điều này làm giảm đáng kể các nỗ lực thiết kế, bởi vì phần máy độc lập cần được phát triển chỉ một lần để tạo mã trung gian di động.[6]

Một trình thông dịch kém phức tạp hơn và do đó dễ dàng port hơn so với trình tạo mã, vì nó không thể thực hiện tối ưu hóa mã do chế độ xem mã chương trình bị giới hạn (nó chỉ thấy một lệnh tại một thời điểm và bạn cần một chuỗi để thực hiện tối ưu hóa). Một số trình thông dịch cực kỳ dễ dàng để port, bởi vì chúng chỉ đưa ra giả định tối thiểu về tập lệnh của phần cứng cơ bản. Kết quả là, máy ảo thậm chí còn đơn giản hơn so với CPU mục tiêu.[7]

Viết các nguồn trình biên dịch hoàn toàn bằng ngôn ngữ lập trình mà trình biên dịch có nghĩa vụ dịch, tạo ra cách tiếp cận sau, tốt hơn được gọi là trình biên dịch bootstrapping, khả thi trên máy đích:

  1. Port trình thông dịch. Điều này cần phải được mã hóa trong mã assembly, sử dụng một bộ assembler đã có trên hệ thống đích
  2. Điều chỉnh nguồn của trình tạo mã cho máy mới.
  3. Thực thi nguồn được điều chỉnh bằng cách sử dụng trình thông dịch với nguồn bộ tạo mã như đầu vào. Điều này sẽ tạo mã máy cho trình tạo mã.

Phần khó khăn của việc viết mã các thói quen tối ưu hóa được thực hiện bằng cách sử dụng ngôn ngữ cấp cao thay vì ngôn ngữ assembly của mục tiêu.

Theo các nhà thiết kế ngôn ngữ BCPL, mã giải thích (trong trường hợp BCPL) nhỏ gọn hơn mã máy; điển hình là từ 2 đến 1. Mã giải thích tuy nhiên chạy chậm hơn khoảng 10 lần so với mã được biên dịch trên cùng một máy.[8]

Các nhà thiết kế ngôn ngữ lập trình Java cố gắng tận dụng lợi thế của sự nhỏ gọn của mã giải nghĩa, bởi vì một chương trình Java có thể cần được truyền qua Internet trước khi thực thi có thể bắt đầu trên Java Virtual Machine đích.

Tài liệu tham khảo

WikiPedia: Porting http://www.oed.com/view/Entry/148098 http://www.ozarksoftscape.com/the-game-collection.... http://www.cgwmuseum.org/galleries/index.php?year=... http://www.cgwmuseum.org/galleries/index.php?year=... https://archive.org/stream/1985-05-anticmagazine/A... https://archive.org/stream/Atari_Software_1984#pag... https://archive.org/stream/info-magazine-13/Info_I... https://www.gnu.org/software/sather/docs-1.2/tutor... https://ieeexplore.ieee.org/document/6312825